<?php
/**
 * Questo componente permette di creare una Galleria Fotografica dall'aspetto professionale
 * con la possibilita' di inserire per ogni immagine una descrizione in formato TESTO/HTML.
 *
 * IMPORTANTE: caricare nell'head i seguenti file
 *
 * <link type="text/css" rel="stylesheet" href="galleryview.css" />
 *
 * <script type="text/javascript" src="jquery.easing.1.3.js"></script>
 * <script type="text/javascript" src="jquery.galleryview-1.1.js"></script>
 * <script type="text/javascript" src="jquery.timers-1.1.2.js"></script>
 * 
 * @author Damiano Ciarla
 */
class ImageGallery
{
	private $imageList		= array();

	private $name			= null;

	private $showFilmstrip	= true;
	private $showScript		= true;

	/**
	 * Valori di configurazione di default modificabili
	 * direttamente al momento della creazione con i metodi SET relativi
	 */

	private $panel_width			= 400;
	private $panel_height			= 300;
	private $frame_width			= 80;
	private $frame_height			= 80;
	private $overlay_height			= 70;
	private $overlay_font_size		= "1em";
	private $overlay_position		= "bottom";
	private $filmstrip_position		= "bottom";
	private $transition_speed		= 400;
	private $transition_interval	= 6000;
	private $overlay_opacity		= 0.6;
	private $overlay_color			= "black";
	private $background_color		= "black";
	private $overlay_text_color		= "white";
	private $caption_text_color		= "white";
	private $border					= "1px solid black";
	private $nav_theme				= "light";
	private $easing					= "swing";
	private $show_captions			= false;
	private $fade_panels			= true;
	private $pause_on_hover			= false;

	/**
	 * Imposta i valori per la creazione della Gallery. Si ricorda di specificare un nome
	 * univoco all'interno della pagina.
	 *
	 * @param string $name		ID della gallery
	 * @param array $imageList	Array contenente le immagini
	 */

	public function __construct($name, $imageList = null)
	{
		$this->name = $name;

		if(!is_null($imageList) and is_array($imageList)) $this->imageList = $imageList;
	}

	/*** -------------------- *** CONFIGURAZIONE PARAMETRI *** -------------------- ***/

	/**
	 * Imposta la lunghezza del pannello
	 *
	 * @param integer $panel_width Lunghezza del pannello. DEFAULT: 400
	 */

	public function setPanelWidth($panel_width)
	{
		if(is_int($panel_width) and $panel_width > 0) $this->panel_width = $panel_width;
	}

	/**
	 * Imposta l'altezza del pannello
	 *
	 * @param integer $panel_height Altezza del pannello. DEFAULT: 300
	 */

	public function setPanelHeight($panel_height)
	{
		if(is_int($panel_height) and $panel_height > 0) $this->panel_height = $panel_height;
	}

	/**
	 * Imposta la larghezza del filmstrip
	 *
	 * @param integer $frame_width Larghezza del filmstrip. DEFAULT: 80
	 */

	public function setFrameWidth($frame_width)
	{
		if(is_int($frame_width) and $frame_width > 0) $this->frame_width = $frame_width;
	}

	/**
	 * Imposta l'altezza del filmstrip
	 *
	 * @param integer $frame_height Altezza del filmstrip. DEFAULT: 80
	 */

	public function setFrameHeight($frame_height)
	{
		if(is_int($frame_height) and $frame_height > 0) $this->frame_height = $frame_height;
	}

	/**
	 * Altezza area descrittiva
	 *
	 * @param <type> $overlay_height Altezza area descrizione immagine. DEFAULT: 70
	 */

	public function setOverlayHeight($overlay_height)
	{
		if(is_int($overlay_height) and $overlay_height > 0) $this->overlay_height = $overlay_height;
	}

	/**
	 * Dimensione testo area descrittiva
	 *
	 * @param string $overlay_font_size Imposta la dimensione del testo nell'area descrittiva. DEFAULT: '1em'
	 */

	public function setOverlayFontSize($overlay_font_size)
	{
		$this->overlay_font_size = $overlay_font_size;
	}

	/**
	 * Posizione area descrittiva
	 *
	 * @param string $overlay_position Posizione area descrittiva. DEFAULT: 'bottom'
	 */

	public function setOverlayPosition($overlay_position)
	{
		if($overlay_position == "bottom" or $overlay_position == "top") $this->overlay_position = $overlay_position;
	}

	/**
	 * Posizione filmstrip
	 *
	 * @param string $filmstrip_position Posizione filstrip. DEFAULT: 'bottom'
	 */

	public function setFilmstripPosition($filmstrip_position)
	{
		if($filmstrip_position == "bottom" or $filmstrip_position == "top") $this->filmstrip_position = $filmstrip_position;
	}

	/**
	 * Durata animazione di transizione
	 *
	 * @param integer $transition_speed Durata dell'animazione di transizione (jQuery time value). DEFAULT: 400
	 */

	public function setTransitionSpeed($transition_speed)
	{
		$this->transition_speed = $transition_speed;
	}

	/**
	 * Durata della transizione
	 *
	 * @param integer $transition_interval Intervallo una transizione e l'altra (jQuery time value). DEFAULT: 6000
	 */

	public function setTransitionInterval($transition_interval)
	{
		$this->transition_interval = $transition_interval;
	}

	/**
	 * Imposta il grado di opacita' del box in cui appare la descrizione dell'immagine
	 *
	 * @param float $overlay_opacity Opacita' del box descrittivo. Valori compresi tra 0.0 e 1.0. DEFAULT: 0.6
	 */

	public function setOverlayOpacity($overlay_opacity)
	{
		if(is_float($overlay_opacity) and $overlay_opacity >= 0.0 and $overlay_opacity <= 1.0) $this->overlay_opacity = $overlay_opacity;
	}

	/**
	 * Imposta il colore che deve avere il box descrittivo
	 *
	 * @param string $overlay_color Colore del box descrittivo. DEFAULT: 'black'
	 */

	public function setOverlayColor($overlay_color)
	{
		$this->overlay_color = $overlay_color;
	}

	/**
	 * Imposta il colore di sfondo dell'Image Gallery
	 *
	 * @param string $background_color Colore sfondo dell'Image Gallery. DEFAULT: 'black'
	 */

	public function setBackgroundColor($background_color)
	{
		$this->background_color = $background_color;
	}

	/**
	 * Imposta il colore del testo presente nel box descrittivo
	 *
	 * @param string $overlay_text_color Colore testo box descrittivo: DEFAULT: 'white'
	 */

	public function setOverlayTextColor($overlay_text_color)
	{
		$this->overlay_text_color = $overlay_text_color;
	}

	/**
	 * Imposta il colore del title dell'immagine
	 *
	 * @param string $caption_text_color Colore title dell'immagine: DEFAULT: 'white'
	 */

	public function setCaptionTextColor($caption_text_color)
	{
		$this->caption_text_color = $caption_text_color;
	}

	/**
	 * Imposta il bordo dell'Image Gallery
	 *
	 * @param string $border Bordo dell'Image Gallery. DEFAULT: '1px solid black'
	 */

	public function setBorder($border)
	{
		$this->border = $border;
	}

	/**
	 * Scelta del tema da utilizzare nella visualizzazione del menu di navigazione
	 *
	 * @param string $nav_theme Tema Image Gallery. DEFAULT: 'dark'
	 */

	public function setNavTheme($nav_theme)
	{
		if($nav_theme == "light" or $nav_theme == "dark") $this->nav_theme = $nav_theme;
	}

	/**
	 *
	 * @param <type> $easing
	 */

	public function setEasing($easing)
	{
		$this->easing = $easing;
	}

	/**
	 * Mostra il titolo dell'immagine
	 *
	 * @param boolean $show_captions Valore TRUE o FALSE. DEFAULT: false
	 */

	public function setShowCaptions($show_captions)
	{
		if(is_bool($show_captions)) $this->show_captions = $show_captions;
	}

	/**
	 *
	 * @param <type> $fade_panels
	 */

	public function setFadePanels($fade_panels)
	{
		if(is_bool($fade_panels)) $this->fade_panels = $fade_panels;
	}

	/**
	 * Imposta se attivare o meno la pausa ogni qual volta si passa con il mouse sopra la foto
	 *
	 * @param boolean $pause_on_hover Valore TRUE o FALSE. DEFAULT: false
	 */

	public function setPauseOnHover($pause_on_hover)
	{
		if(is_bool($pause_on_hover)) $this->pause_on_hover = $pause_on_hover;
	}

	/**
	 * Visualizza o meno il Filmstrip
	 *
	 * @param boolean $showFilmstrip Valore TRUE o FALSE. DEFAULT: true
	 */

	public function setShowFilmstrip($showFilmstrip)
	{
		if(is_bool($showFilmstrip)) $this->showFilmstrip = $showFilmstrip;
	}

	/**
	 * Crea o meno lo script per realizzare l'Image Gallery
	 *
	 * @param boolean $showScript Valore TRUE o FALSE. DEFAULT: false
	 */

	public function setShowScript($showScript)
	{
		if(is_bool($showScript)) $this->showScript = $showScript;
	}

	/**
	 * Metodo che genera lo script per la creazione dell'Image Gallery.
	 *
	 * @param boolean $return Valore TRUE o FALSE. DEFAULT: false
	 * @return string $script Restiuisce il codice per generare lo script
	 */

	public function generateScriptConfig($return = true)
	{
		$script  = "<script type='text/javascript'>";
		$script .= "$('#" . $this->name . "').galleryView({";
		$script .= "panel_width: " . $this->panel_width . ",";
		$script .= "panel_height: " . $this->panel_height . ",";
		$script .= "frame_width: " . $this->frame_width . ",";
		$script .= "frame_height: " . $this->frame_height . ",";
		$script .= "overlay_height: " . $this->overlay_height . ",";
		$script .= "overlay_font_size: '" . $this->overlay_font_size . "',";
		$script .= "overlay_position: '" . $this->overlay_position . "',";
		$script .= "filmstrip_position: '" . $this->filmstrip_position . "',";
		$script .= "transition_speed: " . $this->transition_speed . ",";
		$script .= "transition_interval: " . $this->transition_interval . ",";
		$script .= "overlay_opacity: " . $this->overlay_opacity . ",";
		$script .= "overlay_color: '" . $this->overlay_color . "',";
		$script .= "background_color: '" . $this->background_color . "',";
		$script .= "overlay_text_color: '" . $this->overlay_text_color . "',";
		$script .= "caption_text_color: '" . $this->caption_text_color . "',";
		$script .= "border: '" . $this->border . "',";
		$script .= "nav_theme: '" . $this->nav_theme . "',";
		$script .= "easing: '" . $this->easing . "',";
		$script .= "show_captions: " . ImageGallery::printBooleanString($show_captions) . ",";
		$script .= "fade_panels: " . ImageGallery::printBooleanString($fade_panels) . ",";
		$script .= "pause_on_hover: " . ImageGallery::printBooleanString($pause_on_hover) . "";
		$script .= "});";
		$script .= "</script>";

		if($return)
			return $script;
		else
			echo $script;
	}

	/**
	 * Genera il codice che conterra' l'immagine nelle dimensioni reali ossia e
	 * la descrizione contenuta nel box in overlay
	 *
	 * @param boolean $return		Valore TRUE o FALSE. DEFAULT: false
	 * @return string $panelList	Codice HTML per il PANEL LIST
	 */

	public function generateListImagePanel($return = true)
	{
		$panelList  = "";

		foreach ($this->imageList as $image)
		{
			$panelList .= "<div class='panel'>";
			$panelList .= "<img src='" . $image['IMAGE'] . "' />";
			$panelList .= "<div class='panel-overlay'>" . $image['DESC'] . "</div>";
			$panelList .= "</div>";
		}

		if($return)
			return $panelList;
		else
			echo $panelList;
	}

	/**
	 * Metodo che genera il codice HTML per il Filmstrip
	 *
	 * @param boolean $return		Valore TRUE o FALSE. DEFAULT: false
	 * @return string $filmstrip	Codice HTML per il Filmstrip
	 */

	public function generateListImageFilmstrip($return = true)
	{
		$filmstrip .= "<ul class='filmstrip'>";

		foreach ($this->imageList as $image)
		{
			$filmstrip .= "<li><img src='" . $image['THUMB'] . "' alt='" . $image['THUMB_ALT'] . "' title='" . $image['THUMB_TITLE'] . "' /></li>";
		}

		$filmstrip .= "</ul>";

		if($return)
			return $filmstrip;
		else
			echo $filmstrip;
	}

	/**
	 * IMPORTANTE: caricare nell'head i seguenti file
	 *
	 * <link type="text/css" rel="stylesheet" href="galleryview.css" />
	 *
	 * <script type="text/javascript" src="jquery.easing.1.3.js"></script>
	 * <script type="text/javascript" src="jquery.galleryview-1.1.js"></script>
	 * <script type="text/javascript" src="jquery.timers-1.1.2.js"></script>
	 * 
	 * Questo metodo si occupa di creare tutto il componente dell'Image Gallery
	 * richiamando i vari metodi e stampando il risultato finale
	 */

	public function show()
	{
		$gallery  = "<style>#" . $this->name . " { visibility: hidden; }</style>";

		$gallery .= "<div id='" . $this->name . "' class='galleryview'>\n";

		$gallery .= $this->generateListImagePanel();

		if($this->showFilmstrip) $gallery .= $this->generateListImageFilmstrip();

		$gallery .= "</div>";

		if($this->showScript) $gallery .= $this->generateScriptConfig();

		echo $gallery;
	}

	/*** -------------------- *** METODI INTERNI *** -------------------- ***/

	/**
	 * Questo metodo ritorna il corrispondente valore in stringa del valore passato.
	 * Ad esempio se viene passato il valore NULL il metodo ritorna la stringa 'null'.
	 * Se non viene trovato un valore o nullo o booleano viene semplicemente restituita
	 * la stringa senza alcuna modifica
	 *
	 * @param bool $value	Valore che puo' essere booleano, nullo string o int
	 * @return string		Ritorna il corrispondente valore in stringa del valore passato
	 */

	private static function printBooleanString($value)
	{
		if(is_null($value)) return "null";

		if(is_bool($value) && $value) return "true";

		if(is_bool($value) && !$value) return "false";

		return $value;
	}
}
?>
